/**
 * WebSocket 统一配置模块
 * Unified WebSocket Configuration Module
 * 
 * 提供集中式的 WebSocket 配置管理，支持：
 * - 环境变量配置
 * - 动态 URL 构造
 * - 协议自动适配（http/https → ws/wss）
 * - 重连和心跳配置
 */

/**
 * WebSocket 配置接口
 */
export interface WebSocketConfig {
  /** WebSocket 服务器 URL */
  url: string;
  /** 重连延迟（毫秒） */
  reconnectDelay?: number;
  /** 最大重连次数 */
  maxReconnectAttempts?: number;
  /** 心跳间隔（毫秒） */
  heartbeatInterval?: number;
  /** 连接超时（毫秒） */
  connectionTimeout?: number;
  /** 是否启用自动重连 */
  autoReconnect?: boolean;
  /** 是否启用调试日志 */
  debug?: boolean;
}

/**
 * 默认 WebSocket 配置
 */
const DEFAULT_CONFIG: Partial<WebSocketConfig> = {
  reconnectDelay: 3000,
  maxReconnectAttempts: 10,
  heartbeatInterval: 30000,
  connectionTimeout: 10000,
  autoReconnect: true,
  debug: false,
};

/**
 * 从环境变量获取 WebSocket 配置
 */
function getEnvConfig(): Partial<WebSocketConfig> {
  // 检查是否在浏览器环境
  const isBrowser = typeof window !== 'undefined';
  
  // 从环境变量读取配置（Vite 项目使用 import.meta.env）
  const env = isBrowser && typeof import.meta !== 'undefined' && import.meta.env
    ? import.meta.env
    : process.env;

  return {
    reconnectDelay: env.VITE_WS_RECONNECT_DELAY 
      ? Number(env.VITE_WS_RECONNECT_DELAY) 
      : undefined,
    maxReconnectAttempts: env.VITE_WS_MAX_RECONNECT_ATTEMPTS 
      ? Number(env.VITE_WS_MAX_RECONNECT_ATTEMPTS) 
      : undefined,
    heartbeatInterval: env.VITE_WS_HEARTBEAT_INTERVAL 
      ? Number(env.VITE_WS_HEARTBEAT_INTERVAL) 
      : undefined,
    debug: env.VITE_LOG_LEVEL === 'debug',
  };
}

/**
 * 动态构造 WebSocket URL
 * 
 * 优先级：
 * 1. 显式传入的 URL
 * 2. 环境变量 VITE_WS_URL
 * 3. 根据当前页面协议和主机动态构造
 * 
 * @param path WebSocket 路径（如 '/api/v1/market/ws/market-data'）
 * @param explicitUrl 显式指定的 URL（用于测试或特殊场景）
 * @returns 完整的 WebSocket URL
 */
export function getWebSocketURL(path: string, explicitUrl?: string): string {
  // 如果显式指定了 URL，直接使用
  if (explicitUrl) {
    return ensureWebSocketProtocol(explicitUrl) + path;
  }

  // 检查是否在浏览器环境
  const isBrowser = typeof window !== 'undefined';
  
  // 从环境变量读取配置
  const env = isBrowser && typeof import.meta !== 'undefined' && import.meta.env
    ? import.meta.env
    : process.env;

  const envWsUrl = env.VITE_WS_URL;

  if (envWsUrl) {
    // 使用环境变量配置的 URL
    return ensureWebSocketProtocol(envWsUrl) + path;
  }

  if (isBrowser) {
    // 根据当前页面动态构造
    const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
    const host = window.location.host;
    return `${protocol}//${host}${path}`;
  }

  // 默认开发环境（SSR 或 Node.js 环境）
  return `ws://localhost:8000${path}`;
}

/**
 * 确保 URL 使用 WebSocket 协议
 * @param url 原始 URL
 * @returns 转换后的 WebSocket URL
 */
function ensureWebSocketProtocol(url: string): string {
  if (url.startsWith('ws://') || url.startsWith('wss://')) {
    return url;
  }
  
  if (url.startsWith('http://')) {
    return url.replace('http://', 'ws://');
  }
  
  if (url.startsWith('https://')) {
    return url.replace('https://', 'wss://');
  }
  
  // 如果没有协议，根据当前环境判断
  const isBrowser = typeof window !== 'undefined';
  if (isBrowser && window.location.protocol === 'https:') {
    return `wss://${url}`;
  }
  
  return `ws://${url}`;
}

/**
 * 获取完整的 WebSocket 配置
 * 
 * 合并优先级：
 * 1. 显式传入的配置
 * 2. 环境变量配置
 * 3. 默认配置
 * 
 * @param path WebSocket 路径
 * @param userConfig 用户自定义配置
 * @returns 完整的 WebSocket 配置
 */
export function getWebSocketConfig(
  path: string,
  userConfig?: Partial<WebSocketConfig>
): WebSocketConfig {
  // 合并配置
  const envConfig = getEnvConfig();
  const url = getWebSocketURL(path, userConfig?.url);

  return {
    ...DEFAULT_CONFIG,
    ...envConfig,
    ...userConfig,
    url,
  } as WebSocketConfig;
}

/**
 * 市场数据 WebSocket 配置
 * 预定义的市场数据 WebSocket 配置，简化使用
 */
export function getMarketDataWebSocketConfig(
  userConfig?: Partial<WebSocketConfig>
): WebSocketConfig {
  return getWebSocketConfig('/api/v1/market/ws/market-data', userConfig);
}

/**
 * 导出常量
 */
export const WEBSOCKET_PATHS = {
  /** 市场数据 WebSocket 路径 */
  MARKET_DATA: '/api/v1/market/ws/market-data',
  /** 交易 WebSocket 路径（预留） */
  TRADING: '/api/v1/trading/ws',
  /** 通知 WebSocket 路径（预留） */
  NOTIFICATIONS: '/api/v1/notifications/ws',
} as const;

/**
 * 导出默认配置（用于测试或文档）
 */
export { DEFAULT_CONFIG };

